package cn.jr.test;

import cn.jr.pojo.*;
import cn.jr.service.*;
import cn.jr.service.impl.*;
import cn.jr.util.PageHelper;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;

@SuppressWarnings("all")
public class ShopRunMain {

    private Scanner input = new Scanner(System.in);
    IShopService iss = new ShopServiceImpl();//注册，登录，退款，密码查余额，收款
    IAccountService ias = new AccountServiceImpl();//账户表，更新余额 注册时创建一条(还没做)
    IActiveService iacts = new ActiveServiceImpl();//活动 增删改查
    IOrderService ios = new OrderServiceImpl();//订单表 生成 修改
    IWareService iws = new WareServiceImpl();//商品表 查询
    IOrderProjectService iops = new OrderProjectServiceImpl();//订单项表 添加/修改，删除


    /* 静态资源 */
    // 用户表主键(== 账户表主键)
    private static int userId;
    // 原本的 订单实际总价
    private static double originalMoney;
    // 每次输入的选择 choice(String)
    private static String choice;


    public static void main(String[] args) {
        new ShopRunMain().intro();
    }

    //登录注册
    public void intro() {
        System.out.println("\n*******************************************************");
        System.out.println("***************** 银河超市收银系统 ***********************");
        System.out.println("*******************************************************");
        System.out.println("1.注册\t2.登录\t0.退出");
        System.out.print("请选输入操作：");
        choice = input.next();
        if (choice.equals("1")) { //注册
            userSignin();
        } else if (choice.equals("2")) { //登录
            userLogin();
        } else if (choice.equals("0")) {
            System.out.println("\n********* 感谢使用银河超市收银系统，再见！********************");
            System.exit(1);
        } else {
            System.out.println("\n*** 请输入正确的选项！***");
            intro();
        }
    }

    // 1.注册
    private void userSignin() {
        //操作
        System.out.println("\n----->用户注册");
        System.out.print("请输入用户名：");
        String userName = input.next();
        if (iss.getShopRunIdByName(userName) == 0) {
            //用户名不存在，可注册
            System.out.print("请输入密码：");
            String password = input.next();
            System.out.print("确认密码：");
            String confirmPassword = input.next();//确认密码
            if (confirmPassword.equals(password)) {
                if (iss.Register(userName, password)) {
                    System.out.println("*** 注册成功！***");
                    //IAccountService --ias //账户表，注册时添加账户
                    ias.addAccount(iss.getShopRunIdByName(userName));
                    // 回去重新 注册/登录
                    intro();
                } else {
                    System.out.println("*** 注册失败！***");
                    intro();
                }
            } else {
                System.out.println("*** 密码不正确，注册失败！***");
                intro();
            }
        } else {
            //用户名已存在，不可注册
            System.out.println("*** 该用户名已被注册！***");
            intro();
        }


    }

    // 2.登录
    private void userLogin() {
        //操作
        System.out.println("\n----->用户登录");
        System.out.print("请输入用户名：");
        String userName = input.next();
        System.out.print("请输入密码：");
        String password = input.next();
        if (iss.Login(userName, password)) {
            System.out.println("*** 登录成功！***");
            userId = iss.getShopRunIdByName(userName);
            menu();
        } else {
            System.out.println("*** '用户名' 或 '密码' 错误，请重新登录！***");
            intro();
        }
    }


    //菜单
    public void menu() {
        System.out.println("\n********** 欢迎 " + iss.getShopRunUNameById(userId) + " 来到银河超市收银系统!*****************");
        System.out.print("1.购买\t"); //结账
        System.out.print("2.退货\t");
        System.out.print("3.对账统计\t");
        System.out.print("4.活动\t");
        System.out.print("5.返回登录\t");
        System.out.println("6.退出 ");
        System.out.print("请输入要进行的操作：");
        choice = input.next();
        if (choice.equals("1")) {
//            System.out.println("\n----->购买");
            userAddOrderProject();//生成订单
        } else if (choice.equals("2")) {
            System.out.println("\n----->退货");
            userRemoveOrderProject();//去退货
        } else if (choice.equals("3")) {
            System.out.println("\n----->对账统计");
            moneyCheck();
        } else if (choice.equals("4")) {
//            System.out.println("\n----->活动");
            activity();
        } else if (choice.equals("5")) { //返回登录
            intro();
        } else if (choice.equals("6")) {
            System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
            System.exit(1);
        } else {
            System.out.println("\n*** 请输入正确的选项！***");
            menu();
        }
    }


    /* 1.购买 -- 生成新订单 */
    private void userAddOrderProject() {
        System.out.println("\n----->购买");

        System.out.println("请输入订单编号：");
        String orderNumber = input.next();

        int orderId = ios.getOrderIdByOrderNumber(orderNumber);
        if (orderId != 0) {//该订单已存在
            /*System.out.println("已有订单 " + orderNumber);
            //更新 原本的订单实际总价
            originalMoney = ios.getAnOrderbyOrderNumber(orderNumber).getOrderReallyPrice();
            //获取创建订单时间
            String orderTime = ios.getAnOrderbyOrderNumber(orderNumber).getOrderTime();
            //去 添加/删除/结账
            userAddOrder(orderId, orderTime);*/

            // 该订单已存在，输出：订单创建失败
            System.out.println("*** 该订单已存在，订单创建失败！***");
            System.out.print("\n1.重新创建订单\t2.返回主菜单\t0.退出：");
            choice =  input.next();
            if (choice.equals("1")) {
                userAddOrderProject();
            }else if (choice.equals("2")) {
                menu();
            }else{
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！*******************");
                System.exit(1);
            }
        } else {
            createNewOrder(orderNumber);
        }
    }

    //创建新订单
    private void createNewOrder(String orderNumber) {
        System.out.println("请输入交易日期(yyyy-MM-dd)：");
        String orderTime = input.next();
        if (ios.addOrder(orderNumber, orderTime)) {//创建订单
            System.out.println("*** 成功创建订单 " + orderNumber + " ***");
            originalMoney = 0;
            // 去 添加/移除商品，结账
            userAddOrder(ios.getOrderIdByOrderNumber(orderNumber), orderTime);
        } else {
            System.out.println("创建订单失败，返回主菜单。。。");
            menu();
        }
    }


    //  添加/移除商品，结账
    private void userAddOrder(int orderId, String orderTime) {//订单编号 交易时间
        System.out.print("\n1.添加商品\t");
        System.out.print("2.移除商品\t");
        System.out.print("3.结账");
        System.out.print("\n请输入要进行的操作：");
        choice = input.next();
        if (choice.equals("1")) {
            addW(orderId, orderTime);//添加商品
        } else if (choice.equals("2")) { //移除商品
            deleteW(orderId, orderTime);
        } else if (choice.equals("3")) {
            makeOrder(orderId);
        } else {
            System.out.println("\n*** 请重新输入选择***");
            userAddOrder(orderId, orderTime);
        }
    }

    //  获得 折扣 activeMoney
    private double getActiveMoney(String orderTime) {
        // 获取折扣情况
        ArrayList<Active> activeList = iacts.queryAllActive();
        /*String aStartTime = "";
        String aEndTime = "";*/
        double activeMoney = 1;//折扣 优惠
        int sDays = 0;//订单创建时间 与 活动开始时间 之间的天数
        int eDays = 0;//订单创建时间 与 活动结束时间 之间的天数
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for (Active active : activeList) {
            try {
                Date oTime = sdf.parse(orderTime);//创建订单时间
                Date aSTime = sdf.parse(active.getActiveStartTime());//活动开始时间
                Date aETime = sdf.parse(active.getActiveEndTime());
                sDays = (int) ((oTime.getTime() - aSTime.getTime()) / (1000 * 60 * 60 * 24));//>=0是 活动开始 后
                eDays = (int) ((oTime.getTime() - aETime.getTime()) / (1000 * 60 * 60 * 24));//<=0是 活动结束 前
                if (sDays >= 0 && eDays <= 0) {//活动期间（前后都包）
                    activeMoney = active.getActiveMoney();
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return activeMoney;
    }

    // 1-1 添加商品
    // IOrderService ---ios  //订单表 生成 修改
    // IWareService ---iws //商品表 查询
    // IOrderProjectService ---iops  //订单项表 添加/修改，删除
    private void addW(int orderId, String orderTime) {
        double activeMoney = getActiveMoney(orderTime);
        //先判断该订单里有没有这个商品
        System.out.print("请输入要添加的 商品编号：");
        String waresNumber = input.next();
        //看这个商品 存不存在
        Wares wares = iws.getwareByWareNumber(waresNumber);//<--商品编号 对应的 商品表信息
        if (wares.getWaresId() == 0) {
            System.out.println("*** 该商品不在库中，无法添加！***");
            System.out.println("\n1.重新输入商品编号\t2.返回购物菜单 3.返回主菜单\t0.退出");
            System.out.print("请输入要进行的操作：");
            choice = input.next();
            if (choice.equals("1")) {
                System.out.print("\n");
                addW(orderId, orderTime);
            } else if (choice.equals("2")) {
                userAddOrder(orderId, orderTime);
            } else if (choice.equals("3")) {
                menu();
            }else{
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                System.exit(1);
            }
        } else {
            //进行添加操作
            tryAddW(wares, orderId, waresNumber, activeMoney, orderTime);
        }
    }

    //  1-1 --进行添加操作
    private void tryAddW(Wares wares, int orderId, String waresNumber, double activeMoney, String orderTime) {
        System.out.print("请输入要添加的 商品个数：");
        int addCount = input.nextInt();
        // 在 订单项表 查询 有没有 该 订单项
        OrderProject newOrderProject = iops.getOrderProByOIdAndNum(orderId, waresNumber);
        if (newOrderProject.getWaresNumber() == null) {
            //不存在，要添加(创建一条)
            iops.addOrderProject(orderId, waresNumber, addCount);
            newOrderProject.setOrderId(orderId);
            newOrderProject.setWaresNumber(waresNumber);
            newOrderProject.setWaresName(wares.getWaresName());
            newOrderProject.setWaresCount(addCount);
            newOrderProject.setWaresPrice(wares.getWaresPrice());
            newOrderProject.setWaresAllPrice(wares.getWaresPrice());
            newOrderProject.setOrderReallyPrice(wares.getWaresPrice());
            // 调用 价格更新 方法 ----iops
            int waresCount = iops.getWaresCountByOIdAndNum(orderId, waresNumber);//商品数量
            double waresPrice = newOrderProject.getWaresPrice();//商品单价
            iops.changeAnOrderProByOIdAndNum(orderId, waresNumber, waresCount, waresPrice, activeMoney);
            System.out.println("*** 添加商品成功！***\n");//会去下面遍历输出 + 选择下一步操作
        } else {//存在 --- 修改数量 与 价格
            //商品数量
            int waresCount = iops.getWaresCountByOIdAndNum(orderId, waresNumber) + addCount;
            //商品单价
            double waresPrice = iops.getOrderProByOIdAndNum(orderId, waresNumber).getWaresPrice();
            if (iops.changeAnOrderProByOIdAndNum(orderId, waresNumber, waresCount, waresPrice, activeMoney)) {//拿去赋值
                System.out.println("*** 添加商品成功！***\n");
            } else {
                System.out.println("*** 添加商品失败！***");
                addW(orderId, orderTime);//返回，重新输入商品编号
            }
        }
        //遍历输出目前 订单 商品
        showBuyList(orderId, orderTime);

        System.out.print("\n1.返回下单页面\t2.返回主菜单 \t0.退出：");
        choice = input.next();
        if (choice.equals("1")) {
            userAddOrder(orderId, orderTime);
        } else if (choice.equals("2")) {
            menu();
        } else {
            System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
            System.exit(1);
        }
    }

    // 1-2 移除商品(输入 个数(rCount) 移除 --- 调用下面退货里的方法 ）
    //  在这里判断 有没有，能不能 移除
    private void deleteW(int orderId, String orderTime) {
        // IOrderService ---ios  //生成 修改 订单表
        // OrderProjectServiceImpl ---iops //添加 删除 订单项表
        System.out.print("请输入要移除的 商品编号：");
        String waresNumber = input.next();
        //看这个商品 商品表里 存不存在
        Wares wares = iws.getwareByWareNumber(waresNumber);//<--商品编号 对应的 商品表信息

        if (wares.getWaresId() == 0) {
            System.out.println("*** 该商品不在库中，无法移除！***");
            System.out.println("\n1.重新输入商品编号\t2.返回购物菜单 3.返回主菜单\t0.退出");
            System.out.print("请输入要进行的操作：");
            choice = input.next();
            if (choice.equals("1")) {
                System.out.print("\n");
                addW(orderId, orderTime);
            } else if (choice.equals("2")) {
                userAddOrder(orderId, orderTime);
            } else if (choice.equals("3")) {
                menu();
            } else {
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                System.exit(1);
            }
        } else {
            //看这个商品在不在订单项表中
            if (iops.getOrderProByOIdAndNum(orderId, waresNumber).getOrderId() ==0) {
                //不存在
                System.out.println("*** 该订单不存在此商品，无法移除！***");
                userAddOrder(orderId, orderTime);
            } else {
                //进行 移除操作
                trydeleteW(orderId, orderTime, waresNumber);
                //遍历输出：商品编号、商品名称、商品数量、商品单价、商品总价，在订单最后显示订单总价
                showBuyList(orderId, orderTime);
            }
        }
    }

    //  1-2 --进行 移除操作
    private void trydeleteW(int orderId, String orderTime, String waresNumber) {
        System.out.print("请输入要移除的 商品数量：");
        int removeCount = input.nextInt();
        //获取 该订单里 对应商品的 数量
        int waresCount = iops.getWaresCountByOIdAndNum(orderId, waresNumber);
        // 移除数量==商品数量
        if (removeCount == waresCount) {
            //直接删一条
            System.out.print("\n确认移除？\n1.确认\t2.返回：");
            choice = input.next();
            if (choice.equals("1")) {
                if (iops.removeOrderProject(orderId, waresNumber)) {
                    System.out.println("*** 移除成功！***");
                    //遍历输出目前 订单 商品
                    showBuyList(orderId, orderTime);
                    userAddOrder(orderId, orderTime);
                } else {
                    System.out.println("*** 移除失败！***");
                    userAddOrder(orderId, orderTime);
                }
            } else if (choice.equals("2")) {
                userAddOrder(orderId, orderTime);
            } else {
                System.out.println("\n*** 移除失败，请输入正确的选项！***");
                userAddOrder(orderId, orderTime);
            }
        }
        // 移除数量 > 商品数量 --->移除不了
        else if (removeCount > waresCount) {
            System.out.println("*** 输入的移除数量大于商品数量，无法移除！***");
            System.out.println("\n1.重新输入商品数量\t2.重新输入商品编号 \t3.返回上一级菜单 \t4.返回主菜单 \t0.退出");
            System.out.print("请输入选择：");
            choice = input.next();
            if (choice.equals("1")) {
                trydeleteW(orderId, orderTime, waresNumber);
            } else if (choice.equals("2")) {
                deleteW(orderId, orderTime);//重新输入商品编号
            } else if (choice.equals("3")) {
                userAddOrder(orderId, orderTime);//返回上一级菜单( 重新选 添加/移除 )
            } else if (choice.equals("4")) {
                menu();
            } else {
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                System.exit(1);
            }
        }
        // 移除数量 < 商品数量 --->移除 对应数量(removeCount)
        else if (removeCount < waresCount) {
            System.out.println("\n1.确定移除\t2.重新输入商品编号 \t3.返回上一级菜单 \t4.返回主菜单 \t0.退出");
            System.out.print("请输入选择：");
            choice = input.next();
            if (choice.equals("1")) {
                double waresPrice = iops.getOrderProByOIdAndNum(orderId, waresNumber).getWaresPrice();
                double activeMoney = getActiveMoney(orderTime);
                if (iops.changeAnOrderProByOIdAndNum(orderId, waresNumber, waresCount - removeCount, waresPrice, activeMoney)) {
                    System.out.println("*** 移除成功！***");
                    //遍历输出目前 订单 商品
                    showBuyList(orderId, orderTime);
                    userAddOrder(orderId, orderTime);
                } else {
                    System.out.println("*** 移除失败！***");
                    userAddOrder(orderId, orderTime);
                }
            } else if (choice.equals("2")) {
                deleteW(orderId, orderTime);
            } else if (choice.equals("3")) {
                userAddOrder(orderId, orderTime);
            } else if (choice.equals("4")) {
                menu();
            } else {
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                System.exit(1);
            }
        }

    }

    //  1-2 --添加/移除 商品 后遍历
    private void showBuyList(int orderId, String orderTime) {
        //遍历输出：商品编号、商品名称、商品数量、商品单价、商品总价，在订单最后显示订单总价
        double totalPrice = 0;//订单总价
        ArrayList<OrderProject> list = iops.getOrderProByOrderId(orderId);
        for (OrderProject orderProject : list) {
            System.out.print("商品编号：" + orderProject.getWaresNumber());
            System.out.printf("\t%-5s %-7s", "商品名称：", orderProject.getWaresName());
            System.out.print("\t商品数量：" + orderProject.getWaresCount());//
            System.out.print("\t商品单价：" + orderProject.getWaresPrice());
            System.out.println("\t商品总价：" + orderProject.getWaresAllPrice());//
            totalPrice += orderProject.getWaresAllPrice();
        }
        System.out.printf("%-5s %8.2f\n", "订单总价：", totalPrice);
        userAddOrder(orderId, orderTime);
    }


    // 1-3 生成订单并展示 --->真·结账 ----> userId==accountId
    private void makeOrder(int orderId) {
        double totalPrice = 0;
        double realPrice = 0;
        ArrayList<OrderProject> list = iops.getOrderProByOrderId(orderId);
        System.out.println("\n订单 " + ios.getOrderById(orderId).getOrderNumber() + " 已生成！");
        for (OrderProject orderProject : list) {
            System.out.print("商品编号：" + orderProject.getWaresNumber());
            System.out.printf("\t%-5s %-7s", "商品名称：", orderProject.getWaresName());
            System.out.print("\t商品数量：" + orderProject.getWaresCount());//
            System.out.print("\t商品单价：" + orderProject.getWaresPrice());
            System.out.println("\t商品总价：" + orderProject.getWaresAllPrice());//
            totalPrice += orderProject.getWaresAllPrice();
            realPrice += orderProject.getOrderReallyPrice();
        }
        //  1-3 --结账更新 加钱
        changeMoneyInOrder(totalPrice, realPrice, orderId);
        // 在 账户表 更新--加钱（加addedMoney）
        double addMoney = realPrice - originalMoney;
        //IAccountService ---ias  //账户表，更新余额
        //更新余额 -- 拿 accountId(==userId) 查找并给 accountMoney赋值
        ias.changeMoneyInAccount(userId, addMoney);

        System.out.printf("%-5s %8.2f\n", "订单总价：", totalPrice);
        System.out.printf("%-5s %8.2f\n", "实际总价：", realPrice);
        System.out.print("\n1，返回主菜单\t0.退出：");
        choice = input.next();
        if (choice.equals("1")) {
            menu();
        } else {
            System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
            System.exit(1);
        }
    }

    // 1-3 --结账更新 加钱
    private void changeMoneyInOrder(double waresAllPrice, double orderReallyPrice, int orderId) {
        ios.changeOrder(waresAllPrice, orderReallyPrice, orderId);
    }


    /* 2.退货 */
    // IOrderService ---ios //订单表 生成 修改
    // IWareService ---iws//商品表 查询
    // IOrderProjectService ---iops//订单项表 添加/修改，删除

    // 2-1 查询订单
    private void userRemoveOrderProject() {
        System.out.print("请输入订单编号：");
        String orderNumber = input.next();
        int orderId = ios.getOrderIdByOrderNumber(orderNumber);
        //该订单 存在
        if (orderId != 0) {
            System.out.println("查到订单 " + orderNumber);
            //更新 原本的订单实际总价
            originalMoney = ios.getAnOrderbyOrderNumber(orderNumber).getOrderReallyPrice();
            //展示
            double totalPrice = 0;
            double realPrice = 0;
            ArrayList<OrderProject> list = iops.getOrderProByOrderId(orderId);
            for (OrderProject orderProject : list) {
                System.out.print("商品编号：" + orderProject.getWaresNumber());
                System.out.printf("\t%-5s %-7s", "商品名称：", orderProject.getWaresName());
                System.out.print("\t商品数量：" + orderProject.getWaresCount());//
                System.out.print("\t商品单价：" + orderProject.getWaresPrice());
                System.out.println("\t商品总价：" + orderProject.getWaresAllPrice());//
                totalPrice += orderProject.getWaresAllPrice();
                realPrice += orderProject.getOrderReallyPrice();
            }
            System.out.printf("%-5s %8.2f\n", "订单总价：", totalPrice);
            System.out.printf("%-5s %8.2f\n", "实际总价：", realPrice);

            //去 删除(修改个数，金额)
            userReturnWares(orderId);
        }
        //订单 不存在
        else {
            System.out.print("订单不存在，输入0返回：");
            choice = input.next();
            if (choice.equals("0")) {
                menu();
            } else {
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                System.exit(1);
            }
        }

    }

    // 2-2 退货 --- 输入商品编号(waresNumber)，退货个数
    /*  判断商品存在，个数有没有超
        修改 订单项表(个数，两个金额)，订单表(两个金额)，账户表(账户余额)
        如果退货后个数==0，删除该商品(无需确认)*/
    //添加操作
    //先判断该订单里有没有这个商品
    private void userReturnWares(int orderId) {
        System.out.print("\n请输入要退的商品编号：");
        String waresNumber = input.next();
        // 查询 存不存在
        OrderProject newOrderProject = iops.getOrderProByOIdAndNum(orderId, waresNumber);
        //不存在
        if (newOrderProject.getWaresNumber() == null) {
            System.out.print("*** 商品不存在！***\n1.重新选择退货商品\t2.返回主菜单\t0.退出：");
            choice = input.next();
            if (choice.equals("1")) {
                userReturnWares(orderId);
            } else if (choice.equals("2")) {
                menu();
            } else {
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                System.exit(1);
            }
        }
        //存在 --- 修改数量 与 价格
        else {
            // 调用 价格更新 方法 ----iops
            System.out.print("请输入要退的个数：");
            int returnCount = input.nextInt();
            // 获取 商品数量
            int waresCount = iops.getWaresCountByOIdAndNum(orderId, waresNumber);
            // 退货数量==商品数量
            if (returnCount == waresCount) {
                System.out.println("1.确定退货\t2.重新输入商品编号 \t3.重新输入订单编号 \t4.返回主菜单 \t0.退出");
                System.out.print("请输入选择：");
                choice = input.next();
                if (choice.equals("1")) {
                    //直接删一整条 (只会改 订单项表 的数据)
                    if (iops.removeOrderProject(orderId, waresNumber)) {
                        //更新 账户表 数据
                        double totalPrice = 0;
                        double realPrice = 0;
                        ArrayList<OrderProject> list = iops.getOrderProByOrderId(orderId);
                        for (OrderProject orderProject : list) {
                            totalPrice += orderProject.getWaresAllPrice();
                            realPrice += orderProject.getOrderReallyPrice();
                        }
                        changeMoneyInOrder(totalPrice, realPrice, orderId);
                        // 在 账户表 更新--加钱（加addedMoney）
                        double addMoney = realPrice - originalMoney;
                        //IAccountService ---ias  //账户表，更新余额
                        //更新余额 -- 拿 accountId(==userId) 查找并给 accountMoney赋值
                        if (ias.changeMoneyInAccount(userId, addMoney)) {
                            System.out.println("*** 退货成功！***");
                            // 退货后的展示
                            System.out.println("\n当前订单：" + ios.getOrderById(orderId).getOrderNumber());
                            for (OrderProject orderProject : list) {
                                System.out.print("商品编号：" + orderProject.getWaresNumber());
                                System.out.printf("\t%-5s %-7s", "商品名称：", orderProject.getWaresName());
                                System.out.print("\t商品数量：" + orderProject.getWaresCount());//
                                System.out.print("\t商品单价：" + orderProject.getWaresPrice());
                                System.out.println("\t商品总价：" + orderProject.getWaresAllPrice());//
                            }
                            System.out.printf("%-5s %8.2f\n", "订单总价：", totalPrice);
                            System.out.printf("%-5s %8.2f\n", "实际总价：", realPrice);
                        } else {
                            System.out.println("\n*** 退货失败，返回主菜单 ***");
                            menu();
                        }

                        System.out.println("\n1.继续通过商品编号退货  \t2.重新输入订单编号 \t3.返回主菜单\t0.退出");
                        System.out.print("请输入选择：");
                        choice = input.next();
                        if (choice.equals("1")) {
                            userReturnWares(orderId);//重新输入商品编号
                        } else if (choice.equals("2")) {
                            userRemoveOrderProject();//重新输入订单编号
                        } else if (choice.equals("3")) {
                            menu();
                        } else {
                            System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                            System.exit(1);
                        }
                    } else {
                        System.out.println("\n*** 退货失败！***");
                    }
                } else if (choice.equals("2")) {
                    userReturnWares(orderId);//重新输入商品编号
                } else if (choice.equals("3")) {
                    userRemoveOrderProject();//重新输入订单编号
                } else if (choice.equals("4")) {
                    menu();
                } else {
                    System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                    System.exit(1);
                }
            }
            // 退货数量 > 商品数量 --->退不了
            else if (returnCount > waresCount) {
                System.out.println("\n*** 输入的 退货数量 大于 购买数量，无法退货！***");
                System.out.println("\n1.重新输入商品编号 \t2.重新输入订单编号 \t3.返回主菜单\t0.退出");
                System.out.print("请输入选择：");
                choice = input.next();
                if (choice.equals("1")) {
                    userReturnWares(orderId);//重新输入商品编号
                } else if (choice.equals("2")) {
                    userRemoveOrderProject();//重新输入订单编号
                } else if (choice.equals("3")) {
                    menu();
                } else {
                    System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                    System.exit(1);
                }
            }
            // 退货数量 < 商品数量 --->退货
            else if (returnCount < waresCount) {
                System.out.println("\n1.确定退货\t2.重新输入商品编号 \t3.重新输入订单编号 \t4.返回主菜单 \t0.退出");
                System.out.print("请输入选择：");
                choice = input.next();
                if (choice.equals("1")) {
                    //确定退货
                    //获取订单创建时间
                    Order newOrder = ios.getOrderById(newOrderProject.getOrderId());
                    String orderTime = newOrder.getOrderTime();
                    //获取 折扣优惠
                    double activeMoney = getActiveMoney(orderTime);
                    //商品单价
                    double waresPrice = newOrderProject.getWaresPrice();
                    //退货（修改）
                    if (iops.changeAnOrderProByIdAndNumAndRCount(orderId, waresNumber, waresCount, returnCount, waresPrice, activeMoney)) {
                        //更新 账户表 数据
                        double totalPrice = 0;
                        double realPrice = 0;
                        ArrayList<OrderProject> list = iops.getOrderProByOrderId(orderId);
                        for (OrderProject orderProject : list) {
                            totalPrice += orderProject.getWaresAllPrice();
                            realPrice += orderProject.getOrderReallyPrice();
                        }
                        changeMoneyInOrder(totalPrice, realPrice, orderId);
                        // 在 账户表 更新--加钱（加addedMoney）
                        double addMoney = realPrice - originalMoney;
                        //IAccountService ---ias  //账户表，更新余额
                        //更新余额 -- 拿 accountId(==userId) 查找并给 accountMoney赋值
                        if (ias.changeMoneyInAccount(userId, addMoney)) {
                            System.out.println("\n退货成功！");
                            System.out.println("\n当前订单：" + ios.getOrderById(orderId).getOrderNumber());
                            // 退货后的展示
                            for (OrderProject orderProject : list) {
                                System.out.print("商品编号：" + orderProject.getWaresNumber());
                                System.out.printf("\t%-5s %-6s", "商品名称：", orderProject.getWaresName());
                                System.out.print("\t商品数量：" + orderProject.getWaresCount());//
                                System.out.print("\t商品单价：" + orderProject.getWaresPrice());
                                System.out.println("\t商品总价：" + orderProject.getWaresAllPrice());//
                            }
                            System.out.printf("%-5s %8.2f\n", "订单总价：", totalPrice);
                            System.out.printf("%-5s %8.2f\n", "实际总价：", realPrice);
                        } else {
                            System.out.println("**退货失败！ 返回主菜单**");
                            menu();
                        }

                        System.out.println("\n1.继续通过商品编号退货  \t2.重新输入订单编号 \t3.返回主菜单 \t0.退出");
                        System.out.print("请输入选择：");
                        choice = input.next();
                        if (choice.equals("1")) {
                            userReturnWares(orderId);//重新输入商品编号
                        } else if (choice.equals("2")) {
                            userRemoveOrderProject();//重新输入订单编号
                        } else if (choice.equals("3")) {
                            menu();
                        } else {
                            System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                            System.exit(1);
                        }
                    }
                } else if (choice.equals("2")) {
                    userReturnWares(orderId);//重新输入商品编号
                } else if (choice.equals("3")) {
                    userRemoveOrderProject();//重新输入订单编号
                } else if (choice.equals("4")) {
                    menu();
                } else {
                    System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                    System.exit(1);
                }
            }
        }
    }


    /* 3.对账统计 */
    private void moneyCheck() {
        System.out.print("\n1.账户查询 ");
        System.out.print("\t2.按时间统计 ");
        System.out.print("\t 3.按商品统计 ");
        System.out.print("\t4.返回主菜单 ");
        System.out.println("\t0.退出");
        System.out.print("请输入统计方法：");
        choice = input.next();
        double accountMoney = 0;
        if (choice.equals("1")) {
            // 账户查询 -- 输入密码，查询账户总金额（密码是："qwer1234"）
            moneyCheck1(accountMoney);
        } else if (choice.equals("2")) {
            // 按时间统计 -- 输入起止时间，返回这段时间账户收入金额
            moneyCheck2(accountMoney);
        } else if (choice.equals("3")) {
            // 按商品统计 -- 输入商品编号，统计该商品销售情况
            moneyCheck3(accountMoney);
        } else if (choice.equals("4")) {
            menu();
        } else {
            System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
            System.exit(1);
        }

    }

    // 3-1 账户查询 -- 输入密码，查询账户总金额（密码是："qwer1234"）
    private void moneyCheck1(double accountMoney) {
        //   账户表 -- ias
        System.out.print("请输入账户密码(非登录密码)：");
        String accountPassword = input.next();
        if (accountPassword.equals("qwer1234")) {
            ArrayList<Account> list = ias.getAllAccount();
            for (Account account : list) {
                accountMoney += account.getAccountMoney();
            }
            System.out.printf("%-7s %10.2f\n", "账户总金额为：", accountMoney);//%10.2f-->小数点前7位，小数点后2位
            System.out.print("\n1.返回对账统计\t2.返回主菜单\t0.退出：");
            choice = input.next();
            if (choice.equals("1")) {
                moneyCheck();
            } else if (choice.equals("2")) {
                menu();
            } else {
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                System.exit(1);
            }
        } else {
            System.out.println("\n*** 密码错误！***");
            System.out.print("1.重新输入 \t2.返回主菜单 \t0.退出：");
            choice = input.next();
            if (choice.equals("1")) {
                moneyCheck1(accountMoney);
            } else if (choice.equals("2")) {
                menu();
            } else {
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                System.exit(1);
            }
        }
    }

    // 3-2 按时间统计 -- 输入起止时间，返回这段时间账户收入金额
    private void moneyCheck2(double accountMoney) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        System.out.print("\n请输入查询范围--起始时间(yyyy-MM-dd)：");
        String startDate = input.next();
        System.out.print("请输入查询范围--终止时间(yyyy-MM-dd)：");
        String endDate = input.next();
        try {
            Date sDate = sdf.parse(startDate);
            Date eDate = sdf.parse(endDate);
            //   订单表 -- ios
            ArrayList<Order> list = ios.getAllOrderProject();
            for (Order order : list) {
                Date oTime = sdf.parse(order.getOrderTime());
                if (!oTime.before(sDate) && !oTime.after(eDate)) {
                    accountMoney += order.getOrderReallyPrice();
                }
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("\n " + startDate + " 到 " + endDate);
        System.out.printf("%9s %-8.2f","账户收入金额为：" , accountMoney);
        System.out.print("\n1.返回对账统计\t2.返回主菜单 \t0.退出：");
        choice = input.next();
        if (choice.equals("1")) {
            moneyCheck();
        } else if (choice.equals("2")) {
            menu();
        } else {
            System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
            System.exit(1);
        }
    }

    // 3-3 按商品统计 -- 输入商品编号，统计该商品销售情况
    private void moneyCheck3(double accountMoney) {
        //   订单项表 -- iops
        System.out.print("\n请输入要统计的商品编号：");
        String waresNumber = input.next();
        //看这个商品 存不存在
        Wares wares = iws.getwareByWareNumber(waresNumber);//<--商品编号 对应的 商品表信息
        //不存在
        if (wares.getWaresId() == 0) {
            System.out.println("\n*** 该商品不在库中，无法统计！***");
            System.out.println("\n1.重新输入商品编号\t2.重新选择统计方法\t3.返回主菜单\t0.退出");
            System.out.print("请选择：");
            choice = input.next();
            if (choice.equals("1")) {
                moneyCheck3(accountMoney);
            } else if (choice.equals("2")) {
                moneyCheck();
            } else if (choice.equals("3")) {
                menu();
            } else {
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                System.exit(1);
            }
        } else {
            // 存在 -- 进行 查询 操作
            showMoneyCheck3(waresNumber, accountMoney);
        }
    }

    //  3-3 --进行 查询 操作
        /*   第一行显示  商品编号、 商品名称
          第二行开始显示  订单编号、 商品数量、 商品单价
            最后一行显示  总价、    实际总价 */
    private void showMoneyCheck3(String waresNumber, double accountMoney) {
        double accountAllMoney = 0;
        //查询 订单项表 里的 同一种商品 by 商品编号(waresNumber)
        ArrayList<OrderProject> list = iops.getOrderProByWaresNum(waresNumber);
        //  第一行显示  商品编号、 商品名称
        System.out.print("\n商品编号：" + waresNumber);
        System.out.printf("\t%-5s %-7s", "商品名称：", iws.getwareByWareNumber(waresNumber).getWaresName());
        //  第二行开始 显示 订单编号、商品数量、商品单价
        for (OrderProject orderProject : list) {
            //计算 总价 和 实际总价
            accountAllMoney += orderProject.getWaresAllPrice();//总价
            accountMoney += orderProject.getOrderReallyPrice();//实际总价
            System.out.print("\n订单编号：" + ios.getOrderById(orderProject.getOrderId()).getOrderNumber());
            System.out.print("\t\t商品数量：" + orderProject.getWaresCount());
            System.out.print("\t\t商品单价：" + orderProject.getWaresPrice());
        }
        //  最后一行显示  总价、    实际总价
        System.out.print("\n商品总价：" + accountAllMoney);
        System.out.println("\t\t实际总价：" + accountMoney);
        System.out.println("\n1.重新输入商品编号\t2.重新选择统计方法\t3.返回主菜单\t0.退出");
        System.out.print("请选择：");
        choice = input.next();
        if (choice.equals("1")) {
            moneyCheck3(accountMoney);
        } else if (choice.equals("2")) {
            moneyCheck();
        } else if (choice.equals("3")) {
            menu();
        } else {
            System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
            System.exit(1);
        }
    }


    /* 4.活动 */
    //IActiveService iacts = new ActiveServiceImpl();//活动 增删改查
    private void activity() {
        System.out.println("\n----->活动");
        System.out.print("1.添加活动\t");
        System.out.print("2.查询活动\t");
        System.out.print("3.返回上一级菜单\t");
        System.out.println("0.退出");
        System.out.print("请输入要进行的操作：");
        choice = input.next();
        if (choice.equals("1")) {
            addActivity();
        } else if (choice.equals("2")) {
            queryAvtivity();
        } else if (choice.equals("3")) {
            menu();
        } else {
            System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
            System.exit(1);
        }
    }

    // 4-1 添加活动
    private void addActivity() {
        System.out.println("\n----->添加活动");
        System.out.print("请输入要 添加 的活动名：");
        String activeName = input.next();
        System.out.print("请输入 活动开始时间(yyyy-MM-dd)：");
        String activeStartTime = input.next();
        System.out.print("请输入 活动结束时间(yyyy-MM-dd)：");
        String activeEndTime = input.next();
        System.out.print("请输入 折扣优惠：");
        Double activeMoney = input.nextDouble();
        Active active = new Active(activeName, activeStartTime, activeEndTime, activeMoney);
        if (iacts.addActive(active)) {
            System.out.println("*** 添加活动成功！***");
        } else {
            System.out.println("*** 添加活动失败！***");
        }
        System.out.print("输入0返回上一级菜单：");
        if (input.next().equals("0")) {
            activity();
        } else {
            System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
            System.exit(1);
        }
    }

    // 4-2 查询活动
    //获取 初始ph
    private void queryAvtivity() {
        System.out.println("\n----->活动列表");
        //  分页  准备参数ph
        PageHelper ph = new PageHelper();
        ph.setDateCount(iacts.queryCountByActiveAndPageHelper());
        queryActivityShow(ph);
    }

    // 每次展示后的 选择操作
    private void queryActivityShow(PageHelper ph) {
        //执行 展示
        showActive(ph);
        //选择操作
        choiceFromShowActive(ph);
    }

    //  4-2-- 分页查询( 仅 分页 展示 )
    private void showActive(PageHelper ph) {
        System.out.println("\n当前是第" + ph.getPageIndex() + "/" + ph.getPageCount() + "页：");
        /*System.out.println("当前页展示数据如下：");*/
        ArrayList<Active> list = iacts.queryByActive(ph);
        for (Active active : list) {
            System.out.println(active);
        }
        System.out.print("\n");
    }

    //  4-2-- 选择操作
    private void choiceFromShowActive(PageHelper ph) {
        if (ph.getPageIndex() <= ph.getPageCount() && ph.getPageIndex() > 1) {
            System.out.print("输入 -1 进入上一页；\t");
        }
        if (ph.getPageIndex() < ph.getPageCount() && ph.getPageIndex() >= 1) {
            System.out.print("输入 +1 进入下一页；");
        }
        System.out.print("\n1.修改活动\t");
        System.out.print("2.删除活动\t");
        System.out.print("3.返回活动菜单\t");
        System.out.println("0.退出");
        System.out.print("请输入操作：");
        choice = input.next();
        if (choice.equals("-1") || choice.equals("+1")) {
            if (choice.equals("-1")) {
                ph.setPageIndex(ph.getPageIndex() - 1);
            } else if (choice.equals("+1")) {
                ph.setPageIndex(ph.getPageIndex() + 1);
            }
            queryActivityShow(ph);
        } else if (choice.equals("1")) {
            changeActivity();
        } else if (choice.equals("2")) {
            removeActivity();
        } else if (choice.equals("3")) {
            activity();
        } else if (choice.equals("0")) {
            System.out.println("\n********* 感谢使用银河超市收银系统，再见！***********************************************************");
            System.exit(1);
        } else {
            System.out.println("\n*** 请输入正确的操作！***");
            choiceFromShowActive(ph);
        }
    }


    //  4-2-1 修改活动
    private void changeActivity() {
        System.out.print("\n请输入要 修改 的活动编号(id)：");
//        int activeId = input.nextInt(); //先输入String，再转成int
        String strActiveId = input.next();
        int activeId;
        try {
            activeId = Integer.parseInt(strActiveId);
        } catch (NumberFormatException e) {
            System.out.print("\n*** 请按照正确的格式输入！***");
            changeActivity();
            throw new RuntimeException(e);
        }
        //查询 输出一条活动
        Active active = iacts.queryActiveById(activeId);
        if (active.getActiveId() != null) {
            System.out.println("\n" + active);
            System.out.print("请输入修改后的 活动名：");
            String activeName = input.next();
            System.out.print("请输入修改后的 活动开始时间(yyyy-MM-dd)：");
            String activeStartTime = input.next();
            System.out.print("请输入修改后的 活动结束时间(yyyy-MM-dd)：");
            String activeEndTime = input.next();
            System.out.print("请输入修改后的 折扣优惠：");
            Double activeMoney = input.nextDouble();
            Active reActive = new Active(activeId, activeName, activeStartTime, activeEndTime, activeMoney);
            if (iacts.updateActive(reActive)) {
                System.out.println("\n*** 修改成功！***");
            } else {
                System.out.println("\n*** 修改失败！***");
            }
            System.out.print("输入0返回活动菜单：");
            if (input.next().equals("0")) {
                activity();
            } else {
                System.out.println("\n********* 感谢使用银河超市收银系统，再见！**********************************************");
                System.exit(1);
            }
        } else {
            System.out.println("*** 活动不存在！***");
            activity();
        }

    }

    //  4-2-2 删除活动
    private void removeActivity() {
        System.out.print("\n请输入要 删除 的活动编号(id)：");
        String strActiveId = input.next();
        int activeId;
        try {
            activeId = Integer.parseInt(strActiveId);
        } catch (NumberFormatException e) {
            System.out.print("\n*** 请按照正确的格式输入！***");
            changeActivity();
            throw new RuntimeException(e);
        }
        //查询 输出一条活动
        Active active = iacts.queryActiveById(activeId);
        if (active.getActiveId() != null) {
            System.out.println(active);
            //确认删除
            System.out.print("1.确认删除\t2.返回活动列表\t0.退出：");
            choice = input.next();
            if (choice.equals("1")) {
                ArrayList<Active> list = iacts.deleteActive(active);
                System.out.println(list.size() > 0 ? "*** 删除成功！***" : "*** 删除失败！***");
                queryAvtivity();
            } else if (choice.equals("2")) {
                queryAvtivity();
            } else {
                System.out.println("\n******************** 感谢使用银河超市收银系统，再见！***********************************");
                System.exit(1);
            }
        } else {
            System.out.println("*** 活动不存在！***");
            activity();
        }
    }
}
